import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
class IntCmp implements Comparator<Integer> {

    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
}

public class PriorityQueueDemo {
    //Java中的优先队列包括了PriorityQueue和PriorityBlockingQueue,前者线程不安全，后者线程安全。
    //此处主要讨论PriorityQueue

    //构造方法
    public static void main1(String[] args) {
        //空参的构造方法，默认构造一个小根堆
        PriorityQueue<Integer> pq = new PriorityQueue<>();

        //也可以传入一个集合，根据集合中的元素，构造小根堆
        ArrayList<Integer> arrayList = new ArrayList<>();
        for (int i = 1; i <= 10 ; i++) {
            arrayList.add(i);
        }



        PriorityQueue<Integer> pq1 = new PriorityQueue<>(arrayList);

        System.out.println(pq1.peek());
        System.out.println(pq1.size());

        //在初始化优先队列时，指定其大小
//        PriorityQueue<Integer> pq2 = new PriorityQueue<>(64);
    }

    //默认情况下：PriorityQueue是小根堆，如果要把PriorityQueue做为大根堆来使用，需要在构造PriorityQueue时传入一个比较器
    public static void main2(String[] args) {
        //传入的IntCmp类实现了Comparator接口，重写了compareTo方法，构造的PriorityQueue为大根堆
        PriorityQueue<Integer> pq = new PriorityQueue<>(new IntCmp());
        pq.offer(1);
        pq.offer(2);
        pq.offer(3);
        pq.offer(4);
        System.out.println(pq.peek());
    }

    public static void main3(String[] args) {
        //演示PriorityQueue的API
        //创建一个存储整型的大根堆
        PriorityQueue<Integer> pq = new PriorityQueue<>(new IntCmp());

        pq.offer(1);
        pq.offer(2);
        pq.offer(3);
        pq.offer(4);

        System.out.println(pq.size());
        System.out.println(pq.isEmpty());
    }

    public static void main(String[] args) {

    }
}
